//===========================================================================
/**
 * @file	field_picture.c
 * @brief	フィールド記念撮影
 * @author	Nozomu Saito
 * @date	2008.01.30
 *
 * モジュール名：FldPicture_
 *
 */
//===========================================================================

#include "field_picture.h"
#include "field_event.h"

#include "fieldmap.h"
#include "field/location.h"
#include "field_anime.h"
#include "ev_mapchange.h"

#include "worldmap.h"

#include "zonedata.h"
#include "mapdefine.h"
#include "eventdata.h"		//ゾーン毎のイベントデータ参照のため

#include "system/snd_tool.h"
#include "system/brightness.h"
#include "system/pm_rtc.h"
#include "system/wipe.h"
#include "system/window.h"
#include "system/bmp_menu.h"

#include "map_tool.h"
#include "fld_bgm.h"
#include "fieldmap_work.h"
#include "field_3d_anime_ev.h"

#include "field_cutin.h"
#include "field_ananuke.h"
#include "effect_warppoint.h"

#include "script.h"

#include "savedata/mystatus.h"	//MyStatus_GetMySex
#include "savedata/gimmickwork.h"
#include "savedata/savedata.h"
#include "savedata/picture.h"
#include "savedata/encount.h"

#include "field/situation_local.h"	//Situation_GetTMFootMark
#include "mapdata_warp.h"			//WARPDATA_SearchByRoomID
#include "field_subscreen.h"
#include "report.h"
#include "mapdata_weather.h"		//WeatherData_Get
#include "weather_sys.h"
#include "itemtool/itemsym.h"
#include "sysflag.h"
#include "syswork.h"
#include "ev_time.h"				//EVTIME_Update

#include "fieldmap_mem.h"			//FIELD_HEIGHT_DATA_SIZE

#include "field_hblank.h"

#include "fld_flg_init.h"
#include "place_name.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_connect.h"

#include "talk_msg.h"
#include "fld_bmp.h"

#include "pair_poke.h"
#include "application/album_app.h"

#include "camera_bg.naix"

#include "ev_pokemon.h"	//for EvPoke_GetLivingPokemonTop

#include "field_poketch.h"		//for	FieldSubLcdControler_SubApplicationSet

///初期化、ロード時に立てるビット
#define PIC_P_FLDOBJ_INIT_STA_BIT_ON \
(FLDOBJ_STA_BIT_ZONE_DEL_NOT|FLDOBJ_STA_BIT_HEIGHT_VANISH_OFF)
///初期化、ロード時に下ろすビット
#define PIC_P_FLDOBJ_INIT_STA_BIT_OFF \
(FLDOBJ_STA_BIT_PAUSE_DIR|FLDOBJ_STA_BIT_PAUSE_ANM)

#define POKE_ENTRY_WAIT	(4)

#define DOWN_OFS_PLAYER	(FX32_ONE*2)
#define DOWN_OFS_POKE	(FX32_ONE*2)
#define DOWN_OFS_SP	(FX32_ONE*2)

#define PIC_DISP_TIME	(30)


//ファインダーＢＧ
#define FINDER_FRAME		FLD_MBGFRM_EFFECT2


typedef struct PIC_POKE_POS_tag
{
	u16 x;
	u16 z;
}PIC_POKE_POS;

PICTURE_DATA  TestPicData;
PIC_CAMERA_DATA PicCameraData = {
	0x29aec1,
	{-0x1200,0,0},
	GF_CAMERA_PERSPECTIV,
	0x230,
	150,
	900,
	{0x10500,0,-0x2f000}
};

static const PIC_POKE_POS PicPokePos[6] =
{
	{2,0},
	{1,-1},
	{-1,-1},
	{3,-1},
	{0,-2},
	{2,-2}
};

static const PIC_POKE_POS PicPokePos2 = {1,-1};

#if 0
typedef struct JUMP_POINT_tag
{
	int X;
	int Z;
	int Dir;
	int ZoneID;
}JUMP_POINT;
#endif

typedef struct PIC_POS_DATA_tag
{
	u16 ZoneID;
	u16 Thumbnail;
	u16 X;
	u16 Z;
	u8 CamNo;
	u8 RestObjID;
	u16 AddObjCode;
	u16 DelMdl[2];
}PIC_POS_DATA;

typedef struct PAIR_POKE_REPOS_tag
{
	u16 X;
	u16 Y;
	u16 Dir;
	u16	IsValid:1;
	u16	Vanish:1;
	u16	dmy:14;

}PAIR_POKE_REPOS;

typedef struct _POINT{
	u16 x,z;
	u16	dir;
	u16 zoneID;
}POINT;

typedef struct F_PIC_EVENT_WORK_tag
{
	LOCATION_WORK Next;
	u8 Seq;
	u8 Count;
	u8 Wait;
	u8 PokeCount;
	FIELD_OBJ_PTR ObjPtr[TEMOTI_POKEMAX];
///	int X;
///	int Z;
	POINT	ReturnPoint;
	PAIR_POKE_REPOS	PairPokeData;
	PICTURE_DATA *PicData;
	PICTURE_DATA PicDataRaw;
	u16 DispTime;
	u8 MainSeq;
	u8 DelNum;

	VecFx32 PokeRetVec;
	u8 PokeRetDir;
	u8 dummy[3];

}F_PIC_EVENT_WORK;

struct _FIELD_ALBUM_EVENT{
	int seq;
	int sub_seq;

	u8	ret_val;	///<サブイベントの戻り値格納
	u8	old_map_mode;	///<マップモード保存

	u8	pic_idx;	///<ターゲット写真index
	u8	poke_ct;	///<ターゲット写真のポケモン数

	PICTURE_DATA	pic;	///<ターゲット写真のデータ
	PICTVIEWER_REQ	sublcd_req;

	POINT	retPos;	///<リターンポジション

	FIELD_OBJ_PTR	obj[TEMOTI_POKEMAX];
	void* app_wk;
	PICTURE_SAVE* pic_save;
};//FLD_ALBUM_EVENT;

typedef struct _ALBUM_APP_EVENT{
	int seq;
	int* ret_p;	///<サブイベントの戻り値格納ポインタ
	void* app_wk;
}ALBUM_APP_EVENT;

typedef struct _PIC_VIEW_SET_EVENT{
	int seq;
	PICTURE_ID	id;
	FLD_ALBUM_EVENT*	fae;
	u8				ct;
}PIC_VIEW_SET_EVENT;


// 構造体が想定のサイズとなっているかチェック
#ifdef PM_DEBUG
#ifdef _NITRO
SDK_COMPILER_ASSERT(sizeof(PIC_POS_DATA) == 16);
#endif
#endif

enum {
	PIC_START,			//イベント開始
	PIC_FIELD_FINISH,	//フィールド終了
	PIC_MAP_JUMP,		//記念撮影場所にロケーションデータ書き換え
	PIC_PF_PROC_START,	//記念撮影フィールドプロセス開始
	PIC_SETUP,			//撮影セットアップ
	PIC_RES_DELETE,		//リソース削除
	PIC_PLAYER_SET,		//撮影主人公セット
	PIC_POKE_SET,		//撮影ポケモンセット
	PIC_POKE_SET_WAIT,	//ポケモンセットウェイト
	PIC_SP_SET,			//撮影特殊人物セット
	PIC_SP_SET_WAIT,	//特殊人物セットウェイト
	PIC_SP_POKE_SET,			//撮影ポケモンセット（特殊）
	PIC_SP_POKE_SET_WAIT,	//ポケモンセットウェイト（特殊）
	PIC_ANM_STOP,		//フィールドアニメ停止
	PIC_PF_PROC_FADEIN,	//記念撮影フェードイン
	PIC_MAIN,			//記念撮影メイン
	PIC_PF_PROC_FINISH,	//記念撮影フィールドプロセス終了
	PIC_MAP_RETURN,		//元のロケーションデータに書き換え
	PIC_F_PROC_START, //フィールドプロセス開始
	PIC_PIAR_POKE_REPOSITION, //連れ歩きポケモン位置復帰
	PIC_END,			//イベント終了
};

enum{
	SEQ_ALBUM_APP_CALL,
	SEQ_ALBUM_APP_WAIT,
	SEQ_PIC_INIT,
	SEQ_PIC_FADEIN,
	SEQ_PIC_MAIN,
	SEQ_PIC_FADEOUT,
	SEQ_PIC_END,
	SEQ_RETURN_POS,
	SEQ_EV_END,
};

static BOOL GMEVENT_FieldAlbum(GMEVENT_CONTROL * event);
static BOOL GMEVENT_AlbumApp(GMEVENT_CONTROL * event);
static BOOL GMEVENT_PictureViewSet(GMEVENT_CONTROL * event);

static int SeqFieldAlbum_AlbumAppCall(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_AlbumAppWait(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_PicViewInit(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_PicViewEnd(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_PicViewMain(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_PicFadeIn(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_PicFadeOut(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);
static int SeqFieldAlbum_ReturnPos(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk);

static BOOL GMEVENT_TakeFldPicture(GMEVENT_CONTROL * event);
static FIELD_OBJ_PTR AddPokeFieldOBJ( CONST_FIELD_OBJ_SYS_PTR fos,
		int monsno, u16 formno, int sex, int dir, int x, int z, const BOOL inRare );
static FIELD_OBJ_PTR AddFieldOBJ( CONST_FIELD_OBJ_SYS_PTR fos,
		int obj, int dir, int x, int z, int id);
static void DeleteFieldObjWithoutPlayer( FIELDSYS_WORK * fsys, PICTURE_DATA * pic );
static void DeleteFieldObj(F_PIC_EVENT_WORK * sew);
static void SetupCamera(GF_CAMERA_PTR outCameraPtr);

static void ChangePlayerForm(PLAYER_STATE_PTR player, const int inForm, const int inSex);
static void VanishMdl( FIELDSYS_WORK * fsys, PICTURE_DATA * pic  );

static void SetBG(GF_BGL_INI *ini, const int inHeapID);

#if 0
#ifdef PM_DEBUG
static BOOL DBG_GMEVENT_FldPictureStart(GMEVENT_CONTROL * event);

//--------------------------------------------------------------------------------------------
/**
 * イベントセット（デバッグ用）
 *
 * @param	fsys	フィールドシステムポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void FldPicture_SetEvent(FIELDSYS_WORK * fsys)
{
	F_PIC_EVENT_WORK * fpew = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(F_PIC_EVENT_WORK));
	MI_CpuClear8(fpew, sizeof(F_PIC_EVENT_WORK));


	fpew->Seq = PIC_START;
	fpew->Count = 0;
	fpew->PokeCount = 0;
///	fpew->X = Player_NowGPosXGet( fsys->player );
///	fpew->Z = Player_NowGPosZGet( fsys->player );

	//復帰ポイントセット
	fpew->ReturnPoint.x = Player_NowGPosXGet( fsys->player );
	fpew->ReturnPoint.z = Player_NowGPosZGet( fsys->player );
	fpew->ReturnPoint.dir = Player_DirGet( fsys->player );
	fpew->ReturnPoint.zoneID = fsys->location->zone_id;

	//参照撮影データをセット
	fpew->PicData = &TestPicData;
///	TestPicData.AddObjCode = LEADER1;

	//マップジャンプイベントを作成
	FieldEvent_Set(fsys, DBG_GMEVENT_FldPictureStart, fpew);
}

//--------------------------------------------------------------------------------------------
/**
 * 記念撮影写真参照イベント
 *
 * @param	event		イベントポインタ
 *
 * @return	BOOL		TRUE:終了　FALSE:継続
 */
//--------------------------------------------------------------------------------------------
static BOOL DBG_GMEVENT_FldPictureStart(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	F_PIC_EVENT_WORK * sew = FieldEvent_GetSpecialWork(event);

	switch (sew->Seq) {
	case PIC_START:
		//ブラックアウト開始
		EventCmd_FieldFadeOut(event);
		sew->Seq = PIC_FIELD_FINISH;
		break;
	case PIC_FIELD_FINISH:
		EventCmd_FinishFieldMap(event);
		//望遠鏡モードセット
///		FldFlg_SetScopeMode(fsys, TRUE);
		sew->Seq = PIC_MAP_JUMP;
		break;
	case PIC_MAP_JUMP:
		////写真モードセット
		FldFlg_SetPictureMode(fsys, TRUE);
		{
			int zone = sew->PicData->zoneID;
			int x = sew->PicData->x;
			int z = sew->PicData->z;
			//撮影ポイント作成
			SetLocation(&sew->Next, zone, DOOR_ID_JUMP_CODE, x, z, DIR_DOWN);
		}
		EventCmd_MapChangeByLocation(event, &sew->Next);
		sew->Seq = PIC_PF_PROC_START;
		break;
	case PIC_PF_PROC_START:	//フィールドプロセス開始
		EventCmd_StartFieldMap(event);
		sew->Seq = PIC_SETUP;
		break;
	case PIC_SETUP:		//
		//カメラセットアップ
		SetupCamera(fsys->camera_ptr);
		//主人公以外のフィールドOBJ全消し
		DeleteFieldObjWithoutPlayer( fsys, sew->PicData );
		//指定モデリングデータを非表示にする
		VanishMdl(fsys, sew->PicData);
		// ビューポートの設定
		NNS_G3dGlbSetViewPort(4, 3, 247, 187);

		//ライトをフェイクモードにする
		GF_RTC_StartPicFakeFixTime(sew->PicData->Hour, sew->PicData->Minute);

		sew->Seq = PIC_RES_DELETE;
		break;
	case PIC_RES_DELETE:
		FieldOBJ_BlActCont_ResmGuestDeleteAll( 	fsys->fldobjsys,
												FieldOBJSys_BlActContGet(fsys->fldobjsys) );
		sew->Seq = PIC_POKE_SET;
		break;
	case PIC_PLAYER_SET:
		{
			int code;
			VecFx32 vec;
			u8 sex;
			SAVEDATA * save = GameSystem_GetSaveData(fsys);
			sex = MyStatus_GetMySex( SaveData_GetMyStatus( save ) );

			ChangePlayerForm(fsys->player, sew->PicData->form, sex);
			FieldOBJ_VecDrawOffsGet( Player_FieldOBJGet( fsys->player ), &vec );
			vec.y -= DOWN_OFS_PLAYER;
			FieldOBJ_VecDrawOffsSet( Player_FieldOBJGet( fsys->player ), &vec );

		}

		//特殊OBJとの撮影か？
		if ( sew->PicData->AddObjCode != 0 ){
			sew->Seq = PIC_SP_SET;
			sew->DelNum = 2;
		}else{
			sew->Seq = PIC_POKE_SET;
			sew->DelNum = sew->PicData->poke_num;
		}
		break;
	case PIC_POKE_SET:
		{
			VecFx32 vec;
			PIC_POKE_DATA *poke_data;
			poke_data = &(sew->PicData->poke[sew->PokeCount]);
			if (poke_data->monsNo != 0){
				//ポケモン追加
				sew->ObjPtr[sew->PokeCount] = AddPokeFieldOBJ( fsys->fldobjsys,
															poke_data->monsNo,
															poke_data->form,
															poke_data->sex,
															DIR_DOWN,
															sew->PicData->x+PicPokePos[sew->PokeCount].x,
															sew->PicData->z+PicPokePos[sew->PokeCount].z,
															poke_data->rare );
				FieldOBJ_DrawProcSet( sew->ObjPtr[sew->PokeCount], FieldOBJ_DrawBlActPairPokeNonAnm );
			}else{
				sew->ObjPtr[sew->PokeCount] = NULL;
			}
		}

		sew->PokeCount++;
		sew->Seq = PIC_POKE_SET_WAIT;
		break;
	case PIC_POKE_SET_WAIT:
		if (sew->Count++>POKE_ENTRY_WAIT){
			if (sew->ObjPtr[sew->PokeCount-1] != NULL){
				FIELD_OBJ_PTR fldobj = sew->ObjPtr[sew->PokeCount-1];
				//レアの場合はパレットセット
				if ( PairPoke_IsRare(fldobj) ){
					FieldOBJ_SetPokeColorPlt(1, fldobj);
				}
				FieldOBJ_VecDrawOffsGet( fldobj, &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( fldobj, &vec );
				FieldOBJ_DrawProcCall(fldobj);
			}
			sew->Count = 0;
			if (sew->PokeCount>=sew->PicData->poke_num){
				sew->Seq = PIC_ANM_STOP;
			}else{
				sew->Seq = PIC_POKE_SET;
			}
		}
		break;
	case PIC_SP_SET:
		{
			sew->ObjPtr[0] = AddFieldOBJ( fsys->fldobjsys, sew->PicData->AddObjCode, DIR_DOWN,
					sew->PicData->x+2, sew->PicData->z, FLDOBJ_ID_PICTURE_OBJ);
			sew->Seq = PIC_SP_SET_WAIT;
		}
		break;
	case PIC_SP_SET_WAIT:
		if (sew->Count++>POKE_ENTRY_WAIT){
			VecFx32 vec;
			FieldOBJ_VecDrawOffsGet( sew->ObjPtr[0], &vec );
			vec.y -= DOWN_OFS_SP;
			FieldOBJ_VecDrawOffsSet( sew->ObjPtr[0], &vec );
			FieldOBJ_DrawProcCall(sew->ObjPtr[0]);
			sew->Count = 0;
			sew->Seq = PIC_SP_POKE_SET;
		}
		break;
	case PIC_SP_POKE_SET:
		{
			VecFx32 vec;
			PIC_POKE_DATA *poke_data;
			poke_data = &(sew->PicData->poke[0]);
			if (poke_data->monsNo != 0){
				//ポケモン追加
				sew->ObjPtr[1] = AddPokeFieldOBJ( fsys->fldobjsys,
															poke_data->monsNo,
															poke_data->form,
															poke_data->sex,
															DIR_DOWN,
															sew->PicData->x+PicPokePos2.x,
															sew->PicData->z+PicPokePos2.z,
															poke_data->rare );
				FieldOBJ_DrawProcSet( sew->ObjPtr[1], FieldOBJ_DrawBlActPairPokeNonAnm );

				FieldOBJ_VecDrawOffsGet( sew->ObjPtr[1], &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( sew->ObjPtr[1], &vec );
			}else{
				GF_ASSERT(0);
				sew->ObjPtr[1] = NULL;
			}
		}
		sew->Seq = PIC_SP_POKE_SET_WAIT;
		break;
	case PIC_SP_POKE_SET_WAIT:
		if (sew->Count++>POKE_ENTRY_WAIT){
			if (sew->ObjPtr[1] != NULL){
				FIELD_OBJ_PTR fldobj = sew->ObjPtr[1];
				//レアの場合はパレットセット
				if ( PairPoke_IsRare(fldobj) ){
					FieldOBJ_SetPokeColorPlt(1, fldobj);
				}
			}
			sew->Count = 0;
			sew->DispTime = 0;
			sew->Seq = PIC_ANM_STOP;
		}
		break;
	case PIC_ANM_STOP:
		G3dAnime_StopAllAnm(fsys->AnimeManagerList);
		G3dAnime_SetStartFrameAll(fsys->AnimeManagerList);
		FieldAnimeStop(fsys->fldmap->field_trans_anime);
		sew->Seq = PIC_PF_PROC_FADEIN;
		break;
	case PIC_PF_PROC_FADEIN:
		//フェードイン
		EventCmd_FieldFadeIn(event);
		sew->Seq = PIC_MAIN;
		break;
	case PIC_MAIN:
		//ボタン押下待ち
		if (sys.trg & PAD_BUTTON_A){
			EventCmd_FieldFadeOut(event);			//フェードアウト
			sew->Seq = PIC_PF_PROC_FINISH;
		}
		break;
	case PIC_PF_PROC_FINISH:
		//フェイクモード終了
		GF_RTC_StopFakeTime();
		//追加したフィールドOBJの削除
		DeleteFieldObj(sew);
		EventCmd_FinishFieldMap(event);
		sew->Seq = PIC_MAP_RETURN;
		break;
	case PIC_MAP_RETURN:
		//写真モードリセット
		FldFlg_SetPictureMode(fsys, FALSE);
		{
			int zone = sew->ReturnPoint.zoneID;
			int x = sew->ReturnPoint.x;
			int z = sew->ReturnPoint.z;
			int dir = sew->ReturnPoint.dir;
			//復帰ポイント作成
			SetLocation(&sew->Next, zone, DOOR_ID_JUMP_CODE, x, z, dir);
		}
		EventCmd_MapChangeByLocation(event, &sew->Next);
		sew->Seq = PIC_F_PROC_START;
		break;
	case PIC_F_PROC_START:	//フィールドプロセス開始
		EventCmd_StartFieldMap(event);
		sew->Seq = PIC_PIAR_POKE_REPOSITION;
		break;
	case PIC_PIAR_POKE_REPOSITION:
		sew->Seq = PIC_F_PROC_FADEIN;
		break;
	case PIC_F_PROC_FADEIN:
		EventCmd_FieldFadeIn(event);
		sew->Seq = PIC_END;
		break;
	case PIC_END:		//終了処理
		////望遠鏡モードリセット
///		FldFlg_SetScopeMode(fsys, FALSE);

///		SSC_RereaseScopePointList(sew->ScpDatPtr);
///		SSO_FreeMemory(sew->SafScpObjPtr);
		sys_FreeMemoryEz(sew);
		return TRUE;
	}
	return FALSE;
}

#endif	//PM_DEBUG
#endif

//--------------------------------------------------------------------------------------------
/**
 * イベント フォトアルバム呼び出し
 *
 * @param	fsys	フィールドシステムポインタ
 * @param	inPicPoint		撮影ポイント
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void FldPicture_CallTakePicEvent(FIELDSYS_WORK * fsys, const u16 inPicPoint)
{
	F_PIC_EVENT_WORK * fpew = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(F_PIC_EVENT_WORK));
	MI_CpuClear8(fpew, sizeof(F_PIC_EVENT_WORK));


	fpew->Seq = PIC_START;
	fpew->Count = 0;
	fpew->PokeCount = 0;
///	fpew->X = Player_NowGPosXGet( fsys->player );
///	fpew->Z = Player_NowGPosZGet( fsys->player );

	//復帰ポイントセット
	fpew->ReturnPoint.x = Player_NowGPosXGet( fsys->player );
	fpew->ReturnPoint.z = Player_NowGPosZGet( fsys->player );
	fpew->ReturnPoint.dir = Player_DirGet( fsys->player );
	fpew->ReturnPoint.zoneID = fsys->location->zone_id;
	//連れ歩き復帰ポイント
	if ( PairPoke_IsPairPoke(fsys) ){
		FIELD_OBJ_PTR poke;
		poke = PairPoke_GetFldObjPtr(fsys);
		FieldOBJ_VecPosGet( poke, &fpew->PokeRetVec );
		fpew->PokeRetDir = FieldOBJ_DirDispGet( poke );
	}

	{
		PIC_POS_DATA pic_pos_dat;
		PICTURE_SAVE* pic_save;
		PICTURE_ID	idx;
		pic_save = SaveData_GetPictureSave(GameSystem_GetSaveData(fsys));
		idx = PictureSave_SearchNullID(pic_save);
		if(idx == PICTURE_ID_NULL){
			OS_Printf("写真追加失敗<-空きがありません\n");
			return ;
		}
		//アーカイブデータ参照
		ArchiveDataLoad(&pic_pos_dat, ARC_PIC_POINT_DATA, inPicPoint);

		FldPicture_MakeData(&fpew->PicDataRaw,fsys,
				pic_pos_dat.Thumbnail, pic_pos_dat.ZoneID, pic_pos_dat.X, pic_pos_dat.Z,
				pic_pos_dat.DelMdl[0], pic_pos_dat.DelMdl[1],
				pic_pos_dat.RestObjID, pic_pos_dat.AddObjCode);
///		PictureSave_SetPictureDataSingle(pic_save,(const PICTURE_DATA*)&fpew->PicDataRaw,idx);		//日付ずれ回避のため、あとでセーブ

		//参照撮影データをセット
		fpew->PicData = &fpew->PicDataRaw;
	}

	//マップジャンプイベントを作成
	FieldEvent_Call(fsys->event, GMEVENT_TakeFldPicture, fpew);
}


//--------------------------------------------------------------------------------------------
/**
 * イベント フォトアルバム利用フロー
 *
 * @param	fsys	フィールドシステムポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void EventCmd_CallFieldAlbum(FIELDSYS_WORK * fsys)
{
	FLD_ALBUM_EVENT *wk = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(FLD_ALBUM_EVENT));
	MI_CpuClear8(wk, sizeof(FLD_ALBUM_EVENT));

	//復帰ポイントを取得
	wk->retPos.x = Player_NowGPosXGet(fsys->player);
	wk->retPos.z = Player_NowGPosZGet(fsys->player);
	wk->retPos.dir = Player_DirGet(fsys->player);
	wk->retPos.zoneID = fsys->location->zone_id;

	wk->pic_save = SaveData_GetPictureSave(fsys->savedata);

	//フォトアルバム使用フローイベントを作成
	FieldEvent_Call(fsys->event, GMEVENT_FieldAlbum,wk);
}

//--------------------------------------------------------------------------------------------
/**
 * イベント フォトアルバム利用フローワークからサブスクリーン表示に必要な情報を取得
 *
 * @param	*fae		イベントワーク
 * @param	*dat		サブ画面用写真データ
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void FieldAlbumEvent_GetPictureData(FLD_ALBUM_EVENT* fae,SUBLCD_PICTDATA* dat)
{
	dat->pic = &fae->pic;
	dat->pic_idx = fae->pic_idx;
	dat->pic_max = PictureSave_PictureDataNum(fae->pic_save);
}

//--------------------------------------------------------------------------------------------
/**
 * イベント サブスクリーン制御タスク側からViewerMainを制御するリクエストを発行
 *
 * @param	*fae	イベントワーク
 * @param	req		リクエスト
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void FieldAlbumEvent_PictViewerMainControlReq(FLD_ALBUM_EVENT* fae,PICTVIEWER_REQ req)
{
	fae->sublcd_req = req;
}



//--------------------------------------------------------------------------------------------
/**
 * @brief	フォトアルバムイベント
 *
 * @param	event		イベントポインタ
 *
 * @return	BOOL		TRUE:終了　FALSE:継続
 */
//--------------------------------------------------------------------------------------------
static BOOL GMEVENT_FieldAlbum(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK* fsys = FieldEvent_GetFieldSysWork( event );
	FLD_ALBUM_EVENT* wk = FieldEvent_GetSpecialWork( event );

	switch(wk->seq){
	case SEQ_ALBUM_APP_CALL:
		wk->seq = SeqFieldAlbum_AlbumAppCall(fsys,event,wk);
		break;
	case SEQ_ALBUM_APP_WAIT:
		wk->seq = SeqFieldAlbum_AlbumAppWait(fsys,event,wk);
		break;
	case SEQ_PIC_INIT:
		wk->seq = SeqFieldAlbum_PicViewInit(fsys,event,wk);
		break;
	case SEQ_PIC_FADEIN:
		wk->seq = SeqFieldAlbum_PicFadeIn(fsys,event,wk);
		break;
	case SEQ_PIC_MAIN:
		wk->seq = SeqFieldAlbum_PicViewMain(fsys,event,wk);
		break;
	case SEQ_PIC_FADEOUT:
		wk->seq = SeqFieldAlbum_PicFadeOut(fsys,event,wk);
		break;
	case SEQ_PIC_END:
		wk->seq = SeqFieldAlbum_PicViewEnd(fsys,event,wk);
		break;
	case SEQ_RETURN_POS:
		wk->seq = SeqFieldAlbum_ReturnPos(fsys,event,wk);
		break;
	case SEQ_EV_END:
		////写真モードリセット
		FldFlg_SetPictureMode(fsys, FALSE);
		sys_FreeMemoryEz(wk);
		return TRUE;
	}
	return FALSE;
}


/**
 *	@brief	フィールドアルバムイベント　フォトアルバムアプリ呼び出し
 */
static int SeqFieldAlbum_AlbumAppCall(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	wk->app_wk = FieldAlbum_SetProc(fsys,ALBUM_CALL_NORMAL,wk->pic_idx);
	return SEQ_ALBUM_APP_WAIT;
}

/**
 *	@brief	フィールドアルバムイベント　フォトアルバムアプリ終了待ち
 */
static int SeqFieldAlbum_AlbumAppWait(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	ALBUM_PARAM* param;
	int ret;
	if( FieldEvent_Cmd_WaitSubProcEnd(fsys)) {
		return SEQ_ALBUM_APP_WAIT;
	}
	param = (ALBUM_PARAM*)wk->app_wk;
	ret = param->ret_val;
	wk->ret_val = ret;
	wk->pic_idx = param->ret_idx;
	sys_FreeMemoryEz(wk->app_wk);

	if(ret == ALBUM_RET_PICVIEW){
		return SEQ_PIC_INIT;
	}
	return SEQ_RETURN_POS;
}

/**
 *	@brief	フィールドアルバムイベント　写真初期化イベントコール
 */
static int SeqFieldAlbum_PicViewInit(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	PIC_VIEW_SET_EVENT* vwk = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(PIC_VIEW_SET_EVENT));
	MI_CpuClear8(vwk, sizeof(PIC_VIEW_SET_EVENT));

	//初期化パラメータセット
	PictureSave_GetPictureDataSingle(wk->pic_save,&wk->pic,wk->pic_idx);

	if ( wk->pic.AddObjCode != 0 ){	//特殊人物とポケ1体
		wk->poke_ct = 2;
	}else{		//ポケのみ
		wk->poke_ct = wk->pic.poke_num;
	}
	wk->sublcd_req = PICTVIEWER_REQ_NULL;
	vwk->fae = wk;

	wk->old_map_mode = fsys->MapMode;
	fsys->MapMode = MAP_MODE_PICTURE;
	fsys->sublcd_wk = wk;	//ポインタ通知

	//写真画面生成フローを作成
	FieldEvent_Call(fsys->event, GMEVENT_PictureViewSet,vwk);
	return SEQ_PIC_FADEIN;
}

/**
 *	@brief	フィールドアルバムイベント　写真View終了処理
 */
static int SeqFieldAlbum_PicViewEnd(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	int i;

	switch(wk->sub_seq){
	case 0:
		//フェイクモード終了
		GF_RTC_StopFakeTime();
		//追加したフィールドOBJの削除
		for(i=0;i<wk->poke_ct;i++){
			if (wk->obj[i] != NULL){
				FieldOBJ_Delete(wk->obj[i]);
				wk->obj[i] = NULL;
			}
		}
		EventCmd_FinishFieldMap(event);
		wk->sub_seq++;
		break;
	case 1:
		fsys->MapMode = wk->old_map_mode;
		fsys->sublcd_wk = NULL;	//ポインタ通知解除
		wk->sub_seq = 0;
		switch(wk->sublcd_req){
		case PICTVIEWER_REQ_PREV:
			wk->pic_idx--;
			return SEQ_PIC_INIT;
		case PICTVIEWER_REQ_NEXT:
			wk->pic_idx++;
			return SEQ_PIC_INIT;
		default:
			return SEQ_ALBUM_APP_CALL;
		}
	}
	return SEQ_PIC_END;
}

/**
 *	@brief	フィールドアルバムイベント　写真Viewメイン
 */
static int SeqFieldAlbum_PicViewMain(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	if(wk->sublcd_req == PICTVIEWER_REQ_NULL){
		return SEQ_PIC_MAIN;
	}
	return SEQ_PIC_FADEOUT;
}

/**
 *	@brief	フィールドアルバムイベント　写真初期化フェードイン
 */
static int SeqFieldAlbum_PicFadeIn(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	switch(wk->sub_seq){
	case 0:
		WIPE_SYS_Start(
			WIPE_PATTERN_WMS, WIPE_TYPE_FADEIN,
			WIPE_TYPE_FADEIN, WIPE_FADE_BLACK, WIPE_DEF_DIV, WIPE_DEF_SYNC, HEAPID_WORLD);
		wk->sub_seq++;
		break;
	case 1:
		if(!WIPE_SYS_EndCheck() ){
			break;
		}
		wk->sub_seq = 0;
		return SEQ_PIC_MAIN;
	}
	return SEQ_PIC_FADEIN;
}

/**
 *	@brief	フィールドアルバムイベント　写真初期化フェードアウト
 */
static int SeqFieldAlbum_PicFadeOut(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	switch(wk->sub_seq){
	case 0:
		WIPE_SYS_Start(
			WIPE_PATTERN_WMS, WIPE_TYPE_FADEOUT,
			WIPE_TYPE_FADEOUT, WIPE_FADE_BLACK, WIPE_DEF_DIV, WIPE_DEF_SYNC, HEAPID_WORLD);
		wk->sub_seq++;
		break;
	case 1:
		if(!WIPE_SYS_EndCheck() ){
			break;
		}
		wk->sub_seq = 0;
		return SEQ_PIC_END;
	}
	return SEQ_PIC_FADEOUT;
}

/**
 *	@brief	フィールドアルバムイベント　元の位置に戻る
 */
static int SeqFieldAlbum_ReturnPos(FIELDSYS_WORK* fsys,GMEVENT_CONTROL* event,FLD_ALBUM_EVENT* wk)
{
	LOCATION_WORK next;

	//復帰ポイント作成
	SetLocation(&next, wk->retPos.zoneID, DOOR_ID_JUMP_CODE,
			wk->retPos.x, wk->retPos.z, wk->retPos.dir);

	EventCmd_MapChangeByLocation(event, &next);

	return SEQ_EV_END;
}
//--------------------------------------------------------------------------------------------
/**
 * イベント フォトアルバム呼び出しイベントコール
 *
 * @param	fsys	フィールドシステムポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void EventCmd_CallAlbumApp(FIELDSYS_WORK * fsys,int* ret_p)
{
	ALBUM_APP_EVENT *wk = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(ALBUM_APP_EVENT));
	MI_CpuClear8(wk, sizeof(ALBUM_APP_EVENT));

	wk->ret_p = ret_p;
	//フォトアルバムアプリ呼び出しイベントを作成
	FieldEvent_Call(fsys->event, GMEVENT_AlbumApp,wk);
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	フォトアルバムアプリ呼び出しイベント
 *
 * @param	event		イベントポインタ
 *
 * @return	BOOL		TRUE:終了　FALSE:継続
 */
//--------------------------------------------------------------------------------------------
static BOOL GMEVENT_AlbumApp(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK* fsys = FieldEvent_GetFieldSysWork( event );
	ALBUM_APP_EVENT* wk = FieldEvent_GetSpecialWork( event );

	switch(wk->seq){
	case 0:
		wk->app_wk = FieldAlbum_SetProc(fsys,ALBUM_CALL_NORMAL,0);
		wk->seq++;
		break;
	case 1:
		if( FieldEvent_Cmd_WaitSubProcEnd(fsys)) {
			return FALSE;
		}
		*wk->ret_p = ((ALBUM_PARAM*)wk->app_wk)->ret_val;
		wk->seq = 0;
		sys_FreeMemoryEz(wk->app_wk);
		sys_FreeMemoryEz(wk);
		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	写真画面生成フロー
 *
 * @param	event		イベントポインタ
 *
 * @return	BOOL		TRUE:終了　FALSE:継続
 */
//--------------------------------------------------------------------------------------------
static BOOL GMEVENT_PictureViewSet(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK* fsys = FieldEvent_GetFieldSysWork( event );
	PIC_VIEW_SET_EVENT* wk = FieldEvent_GetSpecialWork( event );
	PICTURE_DATA* pic = &wk->fae->pic;

	switch(wk->seq){
	case 0:
		////写真モードセット
		FldFlg_SetPictureMode(fsys, TRUE);
		//ライトをフェイクモードにする
		GF_RTC_StartPicFakeFixTime(pic->Hour, pic->Minute);
		{
			LOCATION_WORK next;
			//撮影ポイント作成
			SetLocation(&next,pic->zoneID, DOOR_ID_JUMP_CODE, pic->x, pic->z, DIR_DOWN);
			EventCmd_MapChangeByLocation(event, &next);
		}
		wk->seq++;
		break;
	case 1:
		EventCmd_StartFieldMap(event);
		wk->seq++;
		break;
	case 2:
		//カメラセットアップ
		SetupCamera(fsys->camera_ptr);
		//主人公以外のフィールドOBJ全消し
		DeleteFieldObjWithoutPlayer( fsys, pic );
		//指定モデリングデータを非表示にする
		VanishMdl(fsys, pic);
		// ビューポートの設定
		NNS_G3dGlbSetViewPort(4, 3, 252, 188);

		{
			int code;
			VecFx32 vec;

			u8 sex;
			SAVEDATA * save = GameSystem_GetSaveData(fsys);
			sex = MyStatus_GetMySex( SaveData_GetMyStatus( save ) );

			ChangePlayerForm(fsys->player,pic->form, sex);
			FieldOBJ_VecDrawOffsGet( Player_FieldOBJGet( fsys->player ), &vec );
			vec.y -= DOWN_OFS_PLAYER;
			FieldOBJ_VecDrawOffsSet( Player_FieldOBJGet( fsys->player ), &vec );
		}
		wk->seq++;
		break;
	case 3:
		FieldOBJ_BlActCont_ResmGuestDeleteAll( 	fsys->fldobjsys,
												FieldOBJSys_BlActContGet(fsys->fldobjsys) );
		//アニメ停止
		{
			G3dAnime_StopAllAnm(fsys->AnimeManagerList);
			G3dAnime_SetStartFrameAll(fsys->AnimeManagerList);
			FieldAnimeStop(fsys->fldmap->field_trans_anime);
		}
		//特殊OBJとの撮影か？
		if ( pic->AddObjCode != 0 ){
			wk->seq = 6;
		}else{
			wk->seq = 4;
		}
		break;
	case 4:
#if 0
		for(wk->ct = 0;wk->ct < pic->poke_num;wk->ct++){
			VecFx32 vec;
			PIC_POKE_DATA *poke_data;
			poke_data = &(pic->poke[wk->ct]);
			if (poke_data->monsNo != 0){
				//ポケモン追加
				wk->fae->obj[wk->ct] = AddPokeFieldOBJ( fsys->fldobjsys,
													poke_data->monsNo,
													poke_data->form,
													poke_data->sex,
													DIR_DOWN,
													pic->x+PicPokePos[wk->ct].x,
													pic->z+PicPokePos[wk->ct].z,
													poke_data->rare );
				FieldOBJ_DrawProcSet( wk->fae->obj[wk->ct], FieldOBJ_DrawBlActPairPokeNonAnm );

				FieldOBJ_VecDrawOffsGet( wk->fae->obj[wk->ct], &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( wk->fae->obj[wk->ct], &vec );
				{
					FIELD_OBJ_PTR fldobj = wk->fae->obj[wk->ct];
					//レアの場合はパレットセット
					if ( PairPoke_IsRare(fldobj) ){
						FieldOBJ_SetPokeColorPlt(1, fldobj);
					}
				}
			}else{
				wk->fae->obj[wk->ct] = NULL;
			}
		}
		sys_FreeMemoryEz(wk);
		return TRUE;
#endif
		/////////////////////////////////////////////
		{
			VecFx32 vec;
			PIC_POKE_DATA *poke_data;
			poke_data = &(pic->poke[wk->ct]);
			if (poke_data->monsNo != 0){
				//ポケモン追加
				wk->fae->obj[wk->ct] = AddPokeFieldOBJ( fsys->fldobjsys,
													poke_data->monsNo,
													poke_data->form,
													poke_data->sex,
													DIR_DOWN,
													pic->x+PicPokePos[wk->ct].x,
													pic->z+PicPokePos[wk->ct].z,
													poke_data->rare );
				FieldOBJ_DrawProcSet( wk->fae->obj[wk->ct], FieldOBJ_DrawBlActPairPokeNonAnm );
			}else{
				wk->fae->obj[wk->ct] = NULL;
			}
		}
		wk->seq = 5;
		break;
	case 5:		//ポケ追加待ち
		if (1/*sew->Count++>POKE_ENTRY_WAIT*/){
			if (wk->fae->obj[wk->ct] != NULL){
				VecFx32 vec;
				FIELD_OBJ_PTR fldobj = wk->fae->obj[wk->ct];
				//レアの場合はパレットセット
				if ( PairPoke_IsRare(fldobj) ){
					FieldOBJ_SetPokeColorPlt(1, fldobj);
				}
				FieldOBJ_VecDrawOffsGet( fldobj, &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( fldobj, &vec );
				FieldOBJ_DrawProcCall(fldobj);
			}

			wk->ct++;
			if (wk->ct >= pic->poke_num){
				sys_FreeMemoryEz(wk);
				return TRUE;
			}else{
				wk->seq = 4;
			}
		}
		break;
	case 6:
		//特殊人物の追加
		wk->fae->obj[0] = AddFieldOBJ( fsys->fldobjsys, pic->AddObjCode, DIR_DOWN,
				pic->x+2, pic->z, FLDOBJ_ID_PICTURE_OBJ);
		wk->seq = 7;
		break;
	case 7:
		if (1){
			VecFx32 vec;
			FieldOBJ_VecDrawOffsGet( wk->fae->obj[0], &vec );
			vec.y -= DOWN_OFS_SP;
			FieldOBJ_VecDrawOffsSet( wk->fae->obj[0], &vec );
			FieldOBJ_DrawProcCall(wk->fae->obj[0]);
			wk->seq = 8;
		}
		break;
	case 8:
		//ポケの追加
		{
			PIC_POKE_DATA *poke_data;
			poke_data = &(pic->poke[0]);
			if (poke_data->monsNo != 0){
				wk->fae->obj[1] = AddPokeFieldOBJ( fsys->fldobjsys,
												   poke_data->monsNo,
												   poke_data->form,
												   poke_data->sex,
												   DIR_DOWN,
												   pic->x+PicPokePos2.x,
												   pic->z+PicPokePos2.z,
												   poke_data->rare );
				FieldOBJ_DrawProcSet( wk->fae->obj[1], FieldOBJ_DrawBlActPairPokeNonAnm );
			}else{
				wk->fae->obj[1] = NULL;
			}
		}
		wk->seq = 9;
		break;
	case 9:
		if (1){
			VecFx32 vec;
			if (wk->fae->obj[1] != NULL){
				FieldOBJ_VecDrawOffsGet( wk->fae->obj[1], &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( wk->fae->obj[1], &vec );
				FieldOBJ_DrawProcCall( wk->fae->obj[1] );
				{
					FIELD_OBJ_PTR fldobj = wk->fae->obj[1];
					//レアの場合はパレットセット
					if ( PairPoke_IsRare(fldobj) ){
						FieldOBJ_SetPokeColorPlt(1, fldobj);
					}
				}
			}
			sys_FreeMemoryEz(wk);
			return TRUE;
		}
		break;
	}
	return FALSE;
}

//--------------------------------------------------------------
/**
 * 連れ歩きポケモンフィールドOBJ追加
 * @param	fos			FIELD_OBJ_SYS_PTR
 * @param	obj			OBJコード。HERO等
 * @param	dir			初期方向。DIR_UP等
 * @param	x			グリッドX座標
 * @param	y			グリッドY座標
 * @param	add			追加するか？　TURE:追加		FALSE:ダミーを追加
 * @retval	FIELD_OBJ_PTR
 */
//--------------------------------------------------------------
static FIELD_OBJ_PTR AddPokeFieldOBJ( CONST_FIELD_OBJ_SYS_PTR fos,
		int monsno, u16 formno, int sex, int dir, int x, int z, const BOOL inRare )
{
	FIELD_OBJ_PTR fldobj;
	int obj;

	//モンスターナンバーをOBJコードに変換
	obj = PairPoke_GetObjCodeFromMonsNo(monsno, formno, sex);

	fldobj = AddFieldOBJ( fos,obj,dir,x,z,FLDOBJ_ID_POKE_PAIR);

	//ワークを初期化（FLDOBJ_PARAM_0,FLDOBJ_PARAM_1は値がセットされるのでクリア省略）
	FieldOBJ_ParamSet( fldobj, 0, FLDOBJ_PARAM_2 );

	//連れ歩きポケモン情報取得
	PairPoke_SetInfo(fldobj, monsno, formno, inRare);

	return fldobj;
}

//--------------------------------------------------------------
/**
 * 連れ歩きポケモンフィールドOBJ追加
 * @param	fos			FIELD_OBJ_SYS_PTR
 * @param	obj			OBJコード。HERO等
 * @param	dir			初期方向。DIR_UP等
 * @param	x			グリッドX座標
 * @param	z			グリッドZ座標
 * @param	id			OBJID
 * @retval	FIELD_OBJ_PTR
 */
//--------------------------------------------------------------
static FIELD_OBJ_PTR AddFieldOBJ( CONST_FIELD_OBJ_SYS_PTR fos,
		int obj, int dir, int x, int z, int id)
{
	FIELD_OBJ_PTR fldobj;

	fldobj = FieldOBJ_AddHMake( fos, x, z, dir, obj, MV_DMY, ZONE_ID_NOTHING );
	GF_ASSERT( fldobj != NULL && "player init obj add error" );

	FieldOBJ_OBJIDSet( fldobj, id );
	FieldOBJ_EventTypeSet( fldobj, 0 );
	FieldOBJ_EventFlagSet( fldobj, 0 );
	FieldOBJ_MoveLimitXSet( fldobj, MOVE_LIMIT_NOT );
	FieldOBJ_MoveLimitZSet( fldobj, MOVE_LIMIT_NOT );
	FieldOBJ_StatusBit_ON( fldobj, PIC_P_FLDOBJ_INIT_STA_BIT_ON );
	FieldOBJ_StatusBit_OFF( fldobj, PIC_P_FLDOBJ_INIT_STA_BIT_OFF );
	FieldOBJ_StatusBitSet_HeightExpand( fldobj, TRUE );
	return fldobj;
}

//--------------------------------------------------------------
/**
 * 現在発生しているフィールドOBJを全て削除
 * @param	fldobj		削除するFIELD_OBJ_PTR
 * @param	pic			写真データ
 * @retval	nothing
 */
//--------------------------------------------------------------
static void DeleteFieldObjWithoutPlayer( FIELDSYS_WORK * fsys, PICTURE_DATA * pic)
{
	int no = 0;
	FIELD_OBJ_PTR fldobj;
	FIELD_OBJ_PTR player = Player_FieldOBJGet( fsys->player );

	while( FieldOBJSys_FieldOBJSearch(fsys->fldobjsys, &fldobj, &no, FLDOBJ_STA_BIT_USE) ){
		if( fldobj != player ){
/**
			//残すOBJか？
			if ( FieldOBJ_OBJIDGet(fldobj) != pic->RestObjID ){
				FieldOBJ_Delete( fldobj );
			}else{
				OS_Printf("%dを消さずに残す\n",pic->RestObjID);
				//ポーズかける
				FieldOBJ_MovePause( fldobj );
			}
*/
		}
	}
}

static void DeleteFieldObj(F_PIC_EVENT_WORK * sew)
{
	int i;
	for(i=0;i<sew->DelNum;i++){
		if (sew->ObjPtr[i]!=NULL){
			FieldOBJ_Delete(sew->ObjPtr[i]);
		}
	}
}

static void SetupCamera(GF_CAMERA_PTR outCameraPtr)
{
	PIC_CAMERA_DATA *camera_data;

	camera_data = &PicCameraData;

	//距離セット
	GFC_SetCameraDistance(camera_data->distance, outCameraPtr);
	//アングルセット
	GFC_SetCameraAngleRev(&camera_data->angle, outCameraPtr);
	//視野角セット
	GFC_SetCameraPerspWay(camera_data->perspWay, outCameraPtr);
	//ビューセット
	GFC_SetCameraView(camera_data->view, outCameraPtr);
	//シフト
	GFC_ShiftCamera(&camera_data->shift, outCameraPtr);
}


//データ作成
void FldPicture_MakeData(	PICTURE_DATA* pic_data,FIELDSYS_WORK * fsys,const u8 view_point,
							int zoneID, const int inX, const int inZ,
							const int inDelMdl1, const int inDelMdl2,
							const u16 inRestObjID, const u16 inAddObjCode)
{
	POKEMON_PARAM* param;
	int i;
	int poke_num;
	SAVEDATA * save = GameSystem_GetSaveData(fsys);
	MYSTATUS * my = SaveData_GetMyStatus( save );
	POKEPARTY * party = SaveData_GetTemotiPokemon( save );

	OS_Printf("写真データサイズ=%d\n",sizeof(PICTURE_DATA));

#ifdef PM_DEBUG
	//デバッグ処理
	if(pic_data == NULL){
		pic_data = &TestPicData;
	}
#endif	//PM_DEBUG

	//データクリーン
	PictureData_Clear(pic_data);

	//現在の日時を取得
	{
		RTCDate	rtc_d;
		GF_RTC_GetDate(&rtc_d);

		pic_data->date = RTCDate2GFDate(&rtc_d);
	}

	poke_num = PokeParty_GetPokeCount(party);

	PM_strcpy(pic_data->name, MyStatus_GetMyName(my));

	pic_data->tr_sex = MyStatus_GetMySex(my);		//<<仕様変更により未使用変数となりました。セーブサイズが変わるので、消してません。
	pic_data->form = Player_FormGet( fsys->player );
	pic_data->x = inX;
	pic_data->z = inZ;
	pic_data->zoneID = zoneID;	//fsys->location->zone_id;
	pic_data->thumbnail = view_point;
	{
		RTCTime time;
		GF_RTC_GetTime(&time);
		pic_data->Hour = time.hour;
		pic_data->Minute = time.minute;
	}

	//カメラパラメータセット
	MI_CpuCopy8(&PicCameraData,&pic_data->camera,sizeof(PIC_CAMERA_DATA));

	//消す配置モデル
	pic_data->MdlID[0] = inDelMdl1;
	pic_data->MdlID[1] = inDelMdl2;
	//残量ＯＢＪ
	pic_data->RestObjID = inRestObjID;
	//追加ＯＢＪ
	pic_data->AddObjCode = inAddObjCode;
	//特別ＯＢＪと取るときはポケモンは１匹
	if (pic_data->AddObjCode != 0){
		pic_data->poke_num = 1;
	}else{
		pic_data->poke_num = poke_num;
	}

	//連れ歩き（手持ちの戦闘できる先頭ポケ）のデータを作る
	param = EvPoke_GetLivingPokemonTop(party);
	//ニックネームを取得
	PokeParaGet(param,ID_PARA_nickname,pic_data->poke_name);

	//手持ちポケモンみんなで写真取るときのデータ作成
	if (pic_data->AddObjCode == 0){
		for(i=0;i<poke_num;i++){
			param = PokeParty_GetMemberPointer(party, i);
			if ( PokeParaGet(param,ID_PARA_tamago_flag, NULL) ){	//タマゴフラグ
				//タマゴなので無効データにする(モンスターナンバーを0)
				pic_data->poke[i].monsNo = 0;
				pic_data->poke[i].form = 0;
				pic_data->poke[i].rare = 0;
				pic_data->poke[i].sex = 0;
			}else{
				pic_data->poke[i].monsNo = PokeParaGet(param, ID_PARA_monsno, NULL);
				pic_data->poke[i].form = PokeParaGet(param, ID_PARA_form_no, NULL);
				pic_data->poke[i].rare = PokeRareGet(param);
				pic_data->poke[i].sex = PokeParaGet(param, ID_PARA_sex, NULL);
			}
		}
	}else{		//特別ＯＢＪと撮影するときのポケモンデータ作成
		pic_data->poke[0].monsNo = PokeParaGet(param, ID_PARA_monsno, NULL);
		pic_data->poke[0].form = PokeParaGet(param, ID_PARA_form_no, NULL);
		pic_data->poke[0].rare = PokeRareGet(param);
		pic_data->poke[0].sex = PokeParaGet(param, ID_PARA_sex, NULL);

		for(i=1;i<6;i++){
			pic_data->poke[i].monsNo = 0;
			pic_data->poke[i].form = 0;
			pic_data->poke[i].rare = 0;
			pic_data->poke[i].sex = 0;
		}
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 記念撮影イベント
 *
 * @param	event		イベントポインタ
 *
 * @return	BOOL		TRUE:終了　FALSE:継続
 */
//--------------------------------------------------------------------------------------------
static BOOL GMEVENT_TakeFldPicture(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	F_PIC_EVENT_WORK * sew = FieldEvent_GetSpecialWork(event);

	switch (sew->Seq) {
	case PIC_START:
		//ブラックアウト開始
///		EventCmd_FieldFadeOut(event);		<<スクリプトでブラックアウトすることに。
		sew->Seq = PIC_FIELD_FINISH;
		break;
	case PIC_FIELD_FINISH:
		//下画面制御予約(オーバーレイの都合上フィールド解放前に予約しとく)
		FieldSubLcdControler_SubApplicationSet( fsys, SUBLCD_MODE_YESNO_MENU );		//はい・いいえを出すわけではないが、メインメニューを非表示にするため
		EventCmd_FinishFieldMap(event);
		//望遠鏡モードセット
///		FldFlg_SetScopeMode(fsys, TRUE);
		sew->Seq = PIC_MAP_JUMP;
		break;
	case PIC_MAP_JUMP:
		////写真モードセット
		FldFlg_SetPictureMode(fsys, TRUE);
		{
			int zone = sew->PicData->zoneID;
			int x = sew->PicData->x;
			int z = sew->PicData->z;
			//撮影ポイント作成
			SetLocation(&sew->Next, zone, DOOR_ID_JUMP_CODE, x, z, DIR_DOWN);
		}
		EventCmd_MapChangeByLocation(event, &sew->Next);
		sew->Seq = PIC_PF_PROC_START;
		break;
	case PIC_PF_PROC_START:	//フィールドプロセス開始
		EventCmd_StartFieldMap(event);
		sew->Seq = PIC_SETUP;
		break;
	case PIC_SETUP:		//
		//カメラセットアップ
		SetupCamera(fsys->camera_ptr);
		//主人公以外のフィールドOBJ全消し
		DeleteFieldObjWithoutPlayer( fsys, sew->PicData );
		//指定モデリングデータを非表示にする
		VanishMdl(fsys, sew->PicData);

		sew->Seq = PIC_RES_DELETE;
		break;
	case PIC_RES_DELETE:
		FieldOBJ_BlActCont_ResmGuestDeleteAll( 	fsys->fldobjsys,
												FieldOBJSys_BlActContGet(fsys->fldobjsys) );
		sew->Seq = PIC_PLAYER_SET;
		break;
	case PIC_PLAYER_SET:
		{
			int code;
			VecFx32 vec;
			u8 sex;
			SAVEDATA * save = GameSystem_GetSaveData(fsys);
			sex = MyStatus_GetMySex( SaveData_GetMyStatus( save ) );

			ChangePlayerForm(fsys->player, sew->PicData->form, sex);
			FieldOBJ_VecDrawOffsGet( Player_FieldOBJGet( fsys->player ), &vec );
			vec.y -= DOWN_OFS_PLAYER;
			FieldOBJ_VecDrawOffsSet( Player_FieldOBJGet( fsys->player ), &vec );
		}
		//特殊OBJとの撮影か？
		if ( sew->PicData->AddObjCode != 0 ){
			sew->Seq = PIC_SP_SET;
			sew->DelNum = 2;
		}else{
			sew->Seq = PIC_POKE_SET;
			sew->DelNum = sew->PicData->poke_num;
		}
		break;
	case PIC_POKE_SET:
		{
			PIC_POKE_DATA *poke_data;
			poke_data = &(sew->PicData->poke[sew->PokeCount]);

			if (poke_data->monsNo != 0){
				//ポケモン追加
				sew->ObjPtr[sew->PokeCount] = AddPokeFieldOBJ( fsys->fldobjsys,
															poke_data->monsNo,
															poke_data->form,
															poke_data->sex,
															DIR_DOWN,
															sew->PicData->x+PicPokePos[sew->PokeCount].x,
															sew->PicData->z+PicPokePos[sew->PokeCount].z,
															poke_data->rare );
				FieldOBJ_DrawProcSet( sew->ObjPtr[sew->PokeCount], FieldOBJ_DrawBlActPairPokeNonAnm );
			}else{
				sew->ObjPtr[sew->PokeCount] = NULL;
			}
		}

		sew->PokeCount++;
		sew->Seq = PIC_POKE_SET_WAIT;
		break;
	case PIC_POKE_SET_WAIT:
		if (sew->Count++>POKE_ENTRY_WAIT){
			if (sew->ObjPtr[sew->PokeCount-1] != NULL){
				VecFx32 vec;
				FIELD_OBJ_PTR fldobj = sew->ObjPtr[sew->PokeCount-1];
				//レアの場合はパレットセット
				if ( PairPoke_IsRare(fldobj) ){
					FieldOBJ_SetPokeColorPlt(1, fldobj);
				}
				FieldOBJ_VecDrawOffsGet( fldobj, &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( fldobj, &vec );
				FieldOBJ_DrawProcCall(fldobj);
			}
			sew->Count = 0;
			if (sew->PokeCount>=sew->PicData->poke_num){
				sew->DispTime = 0;
				sew->Seq = PIC_ANM_STOP;
			}else{
				sew->Seq = PIC_POKE_SET;
			}
		}
		break;
	case PIC_SP_SET:
		{
			sew->ObjPtr[0] = AddFieldOBJ( fsys->fldobjsys, sew->PicData->AddObjCode, DIR_DOWN,
				sew->PicData->x+2, sew->PicData->z, FLDOBJ_ID_PICTURE_OBJ);
			sew->Seq = PIC_SP_SET_WAIT;
		}
		break;
	case PIC_SP_SET_WAIT:
		if (sew->Count++>POKE_ENTRY_WAIT){
			VecFx32 vec;
			FieldOBJ_VecDrawOffsGet( sew->ObjPtr[0], &vec );
			vec.y -= DOWN_OFS_SP;
			FieldOBJ_VecDrawOffsSet( sew->ObjPtr[0], &vec );
			FieldOBJ_DrawProcCall(sew->ObjPtr[0]);
			sew->Count = 0;
			sew->Seq = PIC_SP_POKE_SET;
		}
		break;
	case PIC_SP_POKE_SET:
		{
			PIC_POKE_DATA *poke_data;
			poke_data = &(sew->PicData->poke[sew->PokeCount]);
			if (poke_data->monsNo != 0){
				//ポケモン追加
				sew->ObjPtr[1] = AddPokeFieldOBJ( fsys->fldobjsys,
															poke_data->monsNo,
															poke_data->form,
															poke_data->sex,
															DIR_DOWN,
															sew->PicData->x+PicPokePos2.x,
															sew->PicData->z+PicPokePos2.z,
															poke_data->rare );
				FieldOBJ_DrawProcSet( sew->ObjPtr[1], FieldOBJ_DrawBlActPairPokeNonAnm );
			}else{
				GF_ASSERT(0);
				sew->ObjPtr[1] = NULL;
			}
		}
		sew->Seq = PIC_SP_POKE_SET_WAIT;
		break;
	case PIC_SP_POKE_SET_WAIT:
		if (sew->Count++>POKE_ENTRY_WAIT){
			if (sew->ObjPtr[1] != NULL){
				VecFx32 vec;
				FIELD_OBJ_PTR fldobj = sew->ObjPtr[1];
				//レアの場合はパレットセット
				if ( PairPoke_IsRare(fldobj) ){
					FieldOBJ_SetPokeColorPlt(1, fldobj);
				}
				FieldOBJ_VecDrawOffsGet( fldobj, &vec );
				vec.y -= DOWN_OFS_POKE;
				FieldOBJ_VecDrawOffsSet( fldobj, &vec );
				FieldOBJ_DrawProcCall(fldobj);
			}
			sew->Count = 0;
			sew->DispTime = 0;
			sew->Seq = PIC_ANM_STOP;
		}
		break;
	case PIC_ANM_STOP:
		G3dAnime_StopAllAnm(fsys->AnimeManagerList);
		G3dAnime_SetStartFrameAll(fsys->AnimeManagerList);
		FieldAnimeStop(fsys->fldmap->field_trans_anime);
		sew->Seq = PIC_PF_PROC_FADEIN;
		break;
	case PIC_PF_PROC_FADEIN:
		//BGセット
		SetBG(fsys->bgl, HEAPID_FIELD);
		//フェードイン
		EventCmd_FieldFadeIn(event);
		sew->MainSeq = 0;
		sew->Seq = PIC_MAIN;
		break;
	case PIC_MAIN:
		switch(sew->MainSeq){
		case 0:	//フィールドHブランク処理ストップ
			FLDHBLANK_SYS_Stop( fsys->fldmap->hblanksys );
			sew->MainSeq++;
		case 1:	//しばしウェイト
			if (sew->DispTime++>=PIC_DISP_TIME){
				sew->MainSeq++;
				sew->DispTime = 0;
			}
			break;
		case 2:	//シャッターおりる
			//シャッターＳＥ
			Snd_SePlay(SEQ_SE_GS_SHUTTER);
			WIPE_SYS_Start( WIPE_PATTERN_M, WIPE_TYPE_SPLITOUT_VSIDE,
					WIPE_TYPE_FADEOUT, WIPE_FADE_BLACK, COMM_BRIGHTNESS_SYNC, 1, HEAPID_FIELD );
			sew->MainSeq++;
			break;
		case 3:	//シャッターおり待ち
			if (WIPE_SYS_EndCheck()) {
				//写真を撮っている間に時間またぎが起きる可能性があるので、ここで写真データの時間を取り直す
				PICTURE_SAVE* pic_save;
				PICTURE_ID	idx;
				pic_save = SaveData_GetPictureSave(GameSystem_GetSaveData(fsys));
				idx = PictureSave_SearchNullID(pic_save);

				//現在の日時を取得
				{
					RTCDate	rtc_d;
					GF_RTC_GetDate(&rtc_d);
					sew->PicData->date = RTCDate2GFDate(&rtc_d);
				}
				{
					RTCTime time;
					GF_RTC_GetTime(&time);
					sew->PicData->Hour = time.hour;
					sew->PicData->Minute = time.minute;
				}
				//データセーブ
				PictureSave_SetPictureDataSingle(pic_save,(const PICTURE_DATA*)&sew->PicDataRaw,idx);

				sew->MainSeq++;
			}
			break;
		case 4:	//シャッター戻す
			WIPE_SYS_Start( WIPE_PATTERN_M, WIPE_TYPE_SPLITIN_VCENTER,
					WIPE_TYPE_FADEOUT, WIPE_FADE_BLACK, COMM_BRIGHTNESS_SYNC, 1, HEAPID_FIELD );
			sew->MainSeq++;
			break;
		case 5:	//シャッター戻り待ち
			if (WIPE_SYS_EndCheck()) {
				sew->MainSeq++;
			}
			break;
		case 6:	//フィールドHブランク処理再開
			FLDHBLANK_SYS_Start( fsys->fldmap->hblanksys );
			sew->MainSeq++;
			break;
		case 7:	//表示
			if (sew->DispTime++>=PIC_DISP_TIME){
				EventCmd_FieldFadeOut(event);			//フェードアウト
				sew->Seq = PIC_PF_PROC_FINISH;
			}
			break;
		}
		break;
	case PIC_PF_PROC_FINISH:
		//フェイクモード終了
		GF_RTC_StopFakeTime();
		//追加したフィールドOBJの削除
		DeleteFieldObj(sew);
		//下画面制御予約(オーバーレイの都合上フィールド解放前に予約しとく)
		FieldSubLcdControler_SubApplicationSet( fsys, SUBLCD_MODE_FIELD_MENU );		//メニューを戻す
		EventCmd_FinishFieldMap(event);
		sew->Seq = PIC_MAP_RETURN;
		break;
	case PIC_MAP_RETURN:
		//写真モードリセット
		FldFlg_SetPictureMode(fsys, FALSE);
		{
			int zone = sew->ReturnPoint.zoneID;
			int x = sew->ReturnPoint.x;
			int z = sew->ReturnPoint.z;
			int dir = sew->ReturnPoint.dir;
			//復帰ポイント作成
			SetLocation(&sew->Next, zone, DOOR_ID_JUMP_CODE, x, z, dir);
		}
		EventCmd_MapChangeByLocation(event, &sew->Next);
		sew->Seq = PIC_F_PROC_START;
		break;
	case PIC_F_PROC_START:	//フィールドプロセス開始
		EventCmd_StartFieldMap(event);
		sew->Seq = PIC_PIAR_POKE_REPOSITION;
		break;
	case PIC_PIAR_POKE_REPOSITION:	//連れ歩き復帰ポイント
		if (PairPoke_IsPairPoke(fsys)){
			if (Player_FormGet( fsys->player ) != HERO_FORM_CYCLE){	//自転車ではないとき
				int player_x, player_z;
				int poke_x, poke_z;
				FIELD_OBJ_PTR fldobj_poke = PairPoke_GetFldObjPtr(fsys);
				FIELD_OBJ_PTR fldobj_player = Player_FieldOBJGet( fsys->player );

				FieldOBJ_VecPosDirInit( fldobj_poke, &sew->PokeRetVec, sew->PokeRetDir );
				//主人公と同じ座標かで分岐
				player_x = FieldOBJ_NowPosGX_Get( fldobj_player );
				player_z = FieldOBJ_NowPosGZ_Get( fldobj_player );
				poke_x = FieldOBJ_NowPosGX_Get( fldobj_poke );
				poke_z = FieldOBJ_NowPosGZ_Get( fldobj_poke );

				if ( (player_x == poke_x)&&(player_z == poke_z) ){
					PairPoke_StartVanish(fldobj_poke, TRUE);		//1歩移動で表示
				}else{
					PairPoke_StartVanish(fldobj_poke, FALSE);		//表示状態で復帰
				}
				FieldOBJ_DrawProcCall(fldobj_poke);
			}
		}
		sew->Seq = PIC_END;
		break;
	case PIC_END:		//終了処理
		sys_FreeMemoryEz(sew);
		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * 主人公の見た目を変更
 *
 * @param	player		自機ポインタ
 * @param	inForm		フォーム
 * @param	inSex		性別
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void ChangePlayerForm(PLAYER_STATE_PTR player, const int inForm, const int inSex)
{
	int code;
	code = Player_FormSexOBJCodeGet( inForm, inSex );
	{
		int old;
		CONST_FIELD_OBJ_SYS_PTR fos;
		FIELD_OBJ_PTR fldobj;
		fldobj = Player_FieldOBJGet( player );
		fos = FieldOBJ_FieldOBJSysGet( fldobj );
		old = FieldOBJ_OBJCodeGet( fldobj );
		FieldOBJ_DrawDelete( fldobj );
		FieldOBJ_BlActResm_ResIDGuestUseCheckDelete( fos, old, fldobj );
		FieldOBJ_DrawResetAlone( fldobj, code );
	}

	{
		EOA_PTR eoa = Player_JointEoaGet( player );
		if( eoa != NULL ){ FE_EoaDelete( eoa ); }
		Player_JointEoaSet( player, NULL );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 指定モデルデータをバニッシュ
 *
 * @param	fsys		フィールドシステムポインタ
 * @param	pic			写真データ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VanishMdl( FIELDSYS_WORK * fsys, PICTURE_DATA * pic  )
{
	u8 i;
	for(i=0;i<2;i++){
		if ( pic->MdlID[i] == 0 ){
			continue;
		}
		//バニッシュ処理
		MPTL_SetVanishMap3DObj(fsys, pic->MdlID[i], TRUE );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * ファインダーＢＧセット
 *
 * @param	ini		BGL
 * @param	inHeapID	ヒープＩＤ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetBG(GF_BGL_INI *ini, const int inHeapID)
{
	//BGパレット転送
	ArcUtil_PalSet(ARC_CAMERA_BG, NARC_camera_bg_camera_bg_nclr, PALTYPE_MAIN_BG, 0, 0, inHeapID);
	//BGキャラ転送
	ArcUtil_BgCharSet(ARC_CAMERA_BG, NARC_camera_bg_camera_bg_lz_ccgr, ini,
			    FINDER_FRAME, 0, 0, 1, inHeapID);
	//スクリーン転送
	ArcUtil_ScrnSet(ARC_CAMERA_BG, NARC_camera_bg_camera_bg_lz_cscr, ini,
			  FINDER_FRAME, 0, 32*24*2, 1, inHeapID);
	GF_BGL_LoadScreenReq(ini, FINDER_FRAME);

	//プライオリティ変更
	GF_BGL_PrioritySet( FINDER_FRAME, 0 );	//フィールド解放するからプライオリティを元に戻す処理は省く
}